package com.cxl.service.impl;

import com.cxl.entity.Good;
import com.cxl.repository.GoodsRepository;
import com.cxl.service.IGoodService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.*;

/**
 * @author: 20971
 * @time: 2022/3/2 14:34
 * @description:
 */
@Service
public class GoodServiceImpl implements IGoodService {

    @Autowired
    private GoodsRepository goodsRepository;

    public void del(Integer id) {
        goodsRepository.deleteById(id);
    }


    public Good save(Good good) {
        return goodsRepository.save(good);
    }

    /**
     * 分页模糊查找 Good
     *Specification == 封装了Jpa查询的一种规格
     * @param good    查询条件对象
     * @param pageNum  页码
     * @param pageSize 每页显示的数据
     * @return
     *
     * root
     * Root接口，主要用于处理实体和字段、实体与实体之间的关系。除了上述例子中的取字段的操作以外，还可以做join操作。
     * query
     * CriteriaQuery接口，主要用于对查询结果的处理，包括groupBy、orderBy、having、distinct等操作。
     * criteriaBuilder
     * CriteriaBuilder接口，主要用于各种条件查询、模拟sql函数等。
     */
    @Override
    public Page<Good> queryList(Good good, Integer pageNum, Integer pageSize) {

        //将查询条件封装存在Specification这个对象中
        Specification<Good> specification = new Specification<Good>() {
            //重新Specification的toPredicate方法
            @Override
            public Predicate toPredicate(Root<Good> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                Predicate predicate = null ;
                if (StringUtils.isNotBlank(good.getName())) {
                    //criteriaBuilder.like模糊查询，第一个参数是根据root.get("字段名称")获取查询字段,第二个参数是like('%xxx%')中，xxx的值
                    predicate = criteriaBuilder.like(root.get("name"), "%" + good.getName() + "%");
                }
                return predicate;
            }
        };
        //分页条件存在这个对象中
        PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize);
        //进行查询操作，第一个参数是查询条件对象，第二个参数是分页对象
        Page<Good> page = goodsRepository.findAll(specification, pageRequest);
        //返回的数据都封装在了Page<Admin>对象中
        return page;
    }


}
